import 'dart:io';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:path_provider/path_provider.dart';
import 'device_auth.dart';

class LibFile {
  static final LibFile _instance = LibFile._internal();

  factory LibFile() {
    return _instance;
  }

  LibFile._internal() {
    // 私有构造函数，用于实现单例模式
  }

  String getPlatformName() {
    if (kIsWeb) {
      return 'Web';
    } else if (Platform.isAndroid) {
      return 'Android';
    } else if (Platform.isIOS) {
      return 'IOS';
    } else if (Platform.isLinux) {
      return 'Linux';
    } else if (Platform.isMacOS) {
      return 'MacOS';
    } else if (Platform.isWindows) {
      return 'Windows';
    } else {
      // 可能是Web或其他未识别的平台
      return 'Unknown';
    }
  }

  /// 获取应用目录
  Future<String> getAppdir() async {
    var dir = await getApplicationDocumentsDirectory();
    var path = "${dir.path}/app";
    print(path);
    await Directory(path).create(recursive: true);
    return "$path/";
  }

  /// 创建目录
  ///
  /// - path: 要创建的目录路径
  /// - returns: 如果目录创建成功则返回true，否则返回false
  Future<bool> createDir(String path) async {
    try {
      if (path.startsWith("/") && getPlatformName() == "Android") {
        await DeviceAuth().get('storage');
      }
      path = (path.startsWith("/")) ? path : "${await getAppdir()}$path";
      await Directory(path).create(recursive: true);
      return true;
    } catch (e) {
      return false;
    }
  }

  /// 移动目录
  ///
  /// - oldPath: 原目录路径文件
  /// - newPath: 新目录路径文件
  /// - returns: 如果目录移动成功则返回true，否则返回false
  Future<bool> move(String oldPath, String newPath) async {
    if ((oldPath.startsWith("/") || newPath.startsWith("/")) &&
        getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    oldPath =
        (!oldPath.startsWith("/")) ? oldPath : "${await getAppdir()}$oldPath";
    newPath =
        (!newPath.startsWith("/")) ? newPath : "${await getAppdir()}$newPath";
    Directory oldDir = Directory(oldPath);
    try {
      if (await exists(newPath)) {
        return false;
      }
      oldDir.renameSync(newPath);
      return true;
    } catch (e) {
      return false;
    }
  }

  /// 删除目录
  ///
  /// - path: 要删除的目录路径
  /// - returns: 如果目录删除成功则返回true，否则返回false
  Future<bool> delDir(String path) async {
    if (path.startsWith("/") && getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    path = (!path.startsWith("/")) ? path : "${await getAppdir()}$path";
    Directory dir = Directory(path);
    try {
      dir.deleteSync(recursive: true);
      return true;
    } catch (e) {
      return false;
    }
  }

  /// 列出目录内容
  ///
  /// - path: 要列出内容的目录路径
  /// - returns: 目录内容的列表，每个元素是一个包含文件名和大小的映射
  Future<List> ls(String path) async {
    if (path.startsWith("/") && getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    path = (!path.startsWith("/")) ? path : "${await getAppdir()}$path";
    Directory dir = Directory(path);
    try {
      List<FileSystemEntity> entities =
          dir.listSync(recursive: false, followLinks: false);
      return entities
          .map((entity) => {
                'filename': entity.path.split('/').last,
                'size': entity is File ? '${entity.lengthSync()} bytes' : 'N/A'
              })
          .toList();
    } catch (e) {
      return [];
    }
  }

  /// 写入文件
  ///
  /// - filePath: 要写入的文件路径
  /// - mode: 写入模式，'w' 表示写入，'a' 表示追加
  /// - value: 要写入的内容
  /// - returns: 如果写入成功则返回true，否则返回false
  Future<bool> writeFile(String filePath, String mode, String value) async {
    if (filePath.startsWith("/") && getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    filePath =
        (filePath.startsWith("/")) ? filePath : "${await getAppdir()}$filePath";
    File file = File(filePath);
    try {
      if (mode == 'w') {
        file.writeAsStringSync(value, mode: FileMode.write);
      } else if (mode == 'a') {
        file.writeAsStringSync(value, mode: FileMode.append);
      } else {
        return false;
      }
      return true;
    } catch (e) {
      print(e);
      return false;
    }
  }

  /// 读取文件
  ///
  /// - filePath: 要读取的文件路径
  /// - returns: 文件的内容
  Future<String> readFile(String filePath) async {
    if (filePath.startsWith("/") && getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    filePath =
        (filePath.startsWith("/")) ? filePath : "${await getAppdir()}$filePath";
    File file = File(filePath);
    try {
      return file.readAsStringSync();
    } catch (e) {
      return "";
    }
  }

  /// 检查文件或目录是否存在
  ///
  /// - path: 要检查的文件或目录路径
  /// - returns: 如果存在则返回true，否则返回false
  Future<bool> exists(String path) async {
    if (path.startsWith("/") && getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    path = (!path.startsWith("/")) ? path : "${await getAppdir()}$path";
    // 创建一个File对象来表示路径可能是文件
    File file = File(path);
    // 检查文件是否存在
    bool fileExists = await file.exists();
    if (fileExists) {
      return true;
    }

    // 如果文件不存在，尝试将路径作为文件夹来检查
    Directory directory = Directory(path);
    // 检查文件夹是否存在
    return await directory.exists();
  }

  /// 复制文件
  ///
  /// - sourcePath: 源文件路径
  /// - destPath: 目标文件路径
  /// - returns: 如果复制成功则返回true，否则返回false
  Future<bool> copy(String sourcePath, String destPath) async {
    if ((sourcePath.startsWith("/") || destPath.startsWith("/")) &&
        getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    sourcePath = (!sourcePath.startsWith("/"))
        ? sourcePath
        : "${await getAppdir()}$sourcePath";
    destPath = (!destPath.startsWith("/"))
        ? destPath
        : "${await getAppdir()}$destPath";
    File sourceFile = File(sourcePath);
    try {
      sourceFile.copySync(destPath);
      return true;
    } catch (e) {
      return false;
    }
  }

  /// 获取文件或目录的最后修改时间
  ///
  /// - path: 要获取最后修改时间的文件或目录路径
  /// - returns: 最后修改时间
  Future<DateTime> lastModified(String path) async {
    if (path.startsWith("/") && getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    path = (!path.startsWith("/")) ? path : "${await getAppdir()}$path";
    File file = File(path);
    try {
      return file.lastModifiedSync();
    } catch (e) {
      return DateTime.now();
    }
  }

  /// 获取文件大小
  ///
  /// - path: 要获取大小的文件路径
  /// - returns: 文件大小（字节）
  Future<int> size(String path) async {
    if (path.startsWith("/") && getPlatformName() == "Android") {
      await DeviceAuth().get('storage');
    }
    path = (!path.startsWith("/")) ? path : "${await getAppdir()}$path";
    File file = File(path);
    try {
      return file.lengthSync();
    } catch (e) {
      return 0;
    }
  }

  /// 获取文件的MIME类型
  ///
  /// - path: 要获取MIME类型的文件路径
  /// - returns: 文件的MIME类型
  String mimeType(String path) {
    String extension = path.split('.').last;
    switch (extension) {
      case 'txt':
        return 'text/plain';
      case 'jpg':
        return 'image/jpeg';
      case 'png':
        return 'image/png';
      default:
        return 'application/unknown';
    }
  }

  /// 获取文件的扩展名
  ///
  /// - path: 要获取扩展名的文件路径
  /// - returns: 文件的扩展名
  String extension(String path) {
    return path.split('.').last;
  }

  /// 获取文件的基本名（不含扩展名）
  ///
  /// - path: 要获取基本名的文件路径
  /// - returns: 文件的基本名
  String basename(String path) {
    return path.split('/').last.split('.').first;
  }

  /// 获取文件的目录名
  ///
  /// - path: 要获取目录名的文件路径
  /// - returns: 文件的目录名
  String dirname(String path) {
    List<String> parts = path.split('/');
    if (parts.isNotEmpty) {
      parts = parts.sublist(0, parts.length - 1);
    }
    return parts.join('/');
  }
}
